package com.guanjialhx.controller;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.util.concurrent.TimeUnit;

/**
 * @author 邓昕劼
 * @version 1.3
 */

@RestController
@CrossOrigin
@RequestMapping(value = "/CDuan")
public class CDuanController {

    //日志打印
    private final Logger log = LoggerFactory.getLogger(CDuanController.class);

    @Value("${WxJavaUrl}")
    private String WxJavaUrl;

    //管家微信公众号 参数
    private static final String appIdWX = "wx017c87e691000d0b";
    private static final String appSecretWx = "67f9e4e055bb024ef185f223ea72e198";

    @Autowired
    private StringRedisTemplate stringRedisTemplate;


    /**
     * 公众号菜单点击 获取code 并重定向
     *
     * @param request
     * @param resp
     */
    @RequestMapping(value = "/redirect_mine", method = RequestMethod.GET)
    public void redirect_mine( HttpServletRequest request, HttpServletResponse resp) {
        /**
         * 网页授权获取用户基本信息：两种 scope 域
         * snsapi_base 不需要用户点同意，直接跳转到授权后的页面，只能用于获取openid，不能获取用户基本信息
         *
         * snsapi_userinfo 会征求用户同意，授权后，可以获取用户基本信息
         */
        String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxcb64d81519996b30&redirect_uri=" +
                WxJavaUrl +
                "/CDuan/oauth_mine?response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect";
        try {
            resp.sendRedirect(url);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取登录用户基本信息
     */
    @RequestMapping(value = "/oauth_mine", method = RequestMethod.GET)
    public void weChatOauth_mine(HttpServletRequest request, HttpServletResponse resp) {
        resp.setCharacterEncoding("UTF-8");
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        resp.setContentType("text/html; charset=UTF-8");
        try {
            //得到code
            String code = request.getParameter("code");
            //长护健康云服务
            String appId = "wxcb64d81519996b30";
            String appSecret = "0bd137a776a560c9562692626d559a51";
            /**
             * 使用code换取access_token
             * 参数说明
             * appid=APPID（公众号唯一标识）
             * secret=SECRET（公众号的appsecret）
             * code=CODE（第一步获取的code参数）
             * grant_type=authorization_code（无需更改）
             *
             * 结果解释
             * access_token	网页授权接口调用凭证,注意：此access_token与基础支持的access_token不同
             * expires_in	access_token接口调用凭证超时时间，单位（秒）
             * refresh_token	用户刷新access_token
             * openid	用户唯一标识，请注意，在未关注公众号时，用户访问公众号的网页，也会产生一个用户和公众号唯一的OpenID
             * scope	用户授权的作用域，使用逗号（,）分隔
             */
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appId + "&secret=" + appSecret + "&code=" + code + "&grant_type=authorization_code";
            String access_tokenJson = httpGetJson(url);
            // String类型转Json对象并获取指定数据
            JsonObject jsonObject = new JsonParser().parse(access_tokenJson).getAsJsonObject();
            //通过getAsJsonArray获取：对应的[]里面的数据
            String access_token = jsonObject.getAsJsonObject().get("access_token")
                    .getAsString();
            String openid = jsonObject.getAsJsonObject().get("openid")
                    .getAsString();

            /**
             * 使用access_token获取用户信息
             * 参数说明
             * access_token=ACCESS_TOKEN（第2步获取的access_token参数，此access_token与基础支持的access_token不同）
             * openid=OPENID（第2步获取的openid参数）
             * langlang=zh_CN	返回国家地区语言版本，zh_CN 简体，zh_TW 繁体，en 英语
             *
             * 结果解释
             * openid	用户的唯一标识
             * nickname	用户昵称
             * sex	用户的性别，值为1时是男性，值为2时是女性，值为0时是未知
             * province	用户个人资料填写的省份
             * city	普通用户个人资料填写的城市
             * country	国家，如中国为CN
             * headimgurl	用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空
             * privilege	用户特权信息，json 数组，如微信沃卡用户为（chinaunicom）
             */
            String urlTwo = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid + "&lang=zh_CN";
            // 用户的唯一标识存到session中   如果该用户推荐 就生成二维码
            request.getSession().setAttribute("openid", openid);
            String userinfoJson = httpGetJson(urlTwo);
            if (!userinfoJson.contains("errcode")) {
                // String类型转Json对象并获取指定数据
                JsonObject userinfoJsonObject = new JsonParser().parse(userinfoJson).getAsJsonObject();
                //通过getAsJsonArray获取：对应的[]里面的数据
                String nickname = userinfoJsonObject.getAsJsonObject().get("nickname").getAsString();
                String sex = userinfoJsonObject.getAsJsonObject().get("sex").getAsString();
                log.info("用户基本信息 ： code=" + code + "---access_token=" + access_token + "---openid=" + openid + "---nickname=" + nickname + "---sex" + sex);
                try {
                    System.out.println("openid = " + openid);
                    resp.sendRedirect("http://gjweb.lihexinzhiye.com/CduanCode?openid="+openid);
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("LoginController/weChatOauth 重定向公众号首页失败");
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }





    /**
     * 加密
     * @param str
     * @return
     * @throws Exception
     */
    public static String encryptBASE64(String str) throws Exception {
        return (new BASE64Encoder()).encodeBuffer(str.getBytes());
    }


    /**
     * 访问http接口得到返回数据 https://wx.changhuyun.com/api/login/jscode2session?appid=""&
     * -暂时停用
     *
     * @param url
     * @return
     */
    public static String httpGetJson(String url) {
        String result = "";
        BufferedReader in = null;
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            //connection.setRequestProperty("contentType", "utf8");
            connection.setReadTimeout(5000);
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            // Map<String, List<String>> map = connection.getHeaderFields();


            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), "UTF-8"));//防止乱码
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            e.printStackTrace();
            result = "";
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

        return result;
    }

}
